package iks.render.anim 
{
	import flash.display.BitmapData;
	import flash.utils.Dictionary;

	/**
	 * 纹理缓存类. 用于管理已经装载的纹理.
	 * @author Yao Zhenyu
	 */
	public final class KTextureCache 
	{
		/**
		 * 构造函数
		 */
		public function KTextureCache(pc : PrivateClass) 
		{
			if (!(pc is PrivateClass))
				throw new ArgumentError("不能实例化 KTextureCache 类");
				
			m_textures = new Dictionary();
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 工厂方法, 得到 KTextureCache 的实例
		 */
		public static function get instance() : KTextureCache
		{
			if (m_instance == null)
				m_instance = new KTextureCache(new PrivateClass());
				
			return m_instance;
		}

		/**
		 * 创建, 并且添加 KTexture2D 对象进缓存. 
		 * 如果 key 中已经存在纹理, 则释放原来的纹理资源, 创建/添加新的纹理资源到缓存中.
		 * @param	key 纹理对应的键
		 * @param	bitmapData 纹理保存的位图数据
		 * @return 创建的纹理数据
		 */
		public function addImage(key : Object, bitmapData : BitmapData) : KTexture2D
		{
			var texture : KTexture2D = m_textures[key];
			if (texture != null)
			{
				texture.dispose();
				delete m_textures[key];
			}
			
			texture = new KTexture2D(bitmapData, key);
			m_textures[key] = texture;
			return texture;
		}
		
		/**
		 * 从缓存中删除指定的纹理, 如果纹理不在缓存中, 则操作无效. 函数不帮助释放 texture 对象的资源, 用户需要自己手动释放.
		 * @param	texture 指定的纹理
		 * @return 如果 texture 在缓存中, 删除, 返回 true; 不在 texture 中, 没有删除, 返回 false;
		 */
		public function removeImage(texture : KTexture2D) : Boolean
		{
			var texture : KTexture2D = m_textures[texture.key];
			if (texture != null)
			{
				delete m_textures[texture.key];
				return true;
			}
			
			return false;
		}
		
		/**
		 * 从缓存中删除指定键对应的纹理, 如果不存在指定键, 则操作无效. 用户需要对返回的 texture 对象手动释放资源.
		 * @param	key 指定的键
		 * @return 如果指定的 key 存在纹理返回其映射的 texture 对象; 否则返回 null;
		 */
		public function removeImageForKey(key : Object) : KTexture2D
		{
			var texture : KTexture2D = m_textures[key];
			
			if (texture != null)
			{
				delete m_textures[key];
				return texture;
			}
			
			return null;
		}
		
		/**
		 * 删除所有键, 及其映射的 texture 对象.
		 */
		public function removeAllImage() : void
		{
			var keys : Vector.<Object> = new Vector.<Object>();
			
			// 获取所有的键
			for each (var tex : KTexture2D in m_textures)
				keys.push(tex.key);
				
			for each (var key : Object in keys)
			{
				m_textures[key].dispose();
				delete m_textures[key];
			}
		}
		
		/**
		 * 获得指定键对应的纹理
		 * @param	key 指定键
		 * @return 如果存在则返回对应的纹理, 否则返回 null.
		 */
		public function getTextureForKey(key : Object) : KTexture2D
		{
			return m_textures[key];
		}
		
		/**
		 * 在输出面板输出数据信息
		 */
		public function dumpCacheTextureInfo() : void
		{
			var totalMemory : uint = 0;
			
			trace("KTextureCache: ");
			for each (var tex : KTexture2D in m_textures)
			{
				trace("\t" + tex);
				totalMemory += tex.memory;
			}
			trace("Total memory is: " + totalMemory);
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		private static var m_instance : KTextureCache = null;
		private var m_textures : Dictionary = null;
	}

}

class PrivateClass
{
}





























///////////////////////////////////////////////////////////////////////////////////////////////////
// end file


